#ifndef TAGSMANAGER_H
#define TAGSMANAGER_H

#include "Archivo.h"
#include "RegistroFijoTagIndex.h"
#include <set>
#include <algorithm>
#include "NewsManager.h"

class TagItemConsulta
{
        private:
                TCId idFeed;
                TCPosicionEnLista posicion;
                TCTimeStamp fechaNoticia;
        public:
                TagItemConsulta();
                virtual ~TagItemConsulta();

                TCId getIdFeed() const;
                TCPosicionEnLista getPosicion() const;
                TCTimeStamp getFechaNoticia() const;

                void setIdFeed(TCId idFeed);
                void setPosicion(TCPosicionEnLista posicion);
                void setFechaNoticia(TCTimeStamp fechaNoticia);

                bool less (const TagItemConsulta &otroTagItemConsulta) const;
};


typedef set<TagItemConsulta> ConjuntoTagItemConsulta;

class TagsManager
{
        private:
                string directorioBase;
                string IdToString(TCId id);

                //devuelve los elementos de una categoria.
                //en una lista de elementos TagItemConsulta ordenada
                //por fechaNoticia
                ConjuntoTagItemConsulta ConsultaPorCategoria(TCId idCategoria);
        public:
                TagsManager();
                virtual ~TagsManager();

                bool InicializarManager(string DirectorioInicial);

                //se fija si existe el archivo de la categoria recibida,
                //sino, lo crea.
                bool AgregarCategoria(TCId idCategoria);

                //recibe un id de feed, la posicion en el indice
                //precondicion : el archivo de la categoria existe.
                bool AgregarNoticia(TCId idCategoria, TCId idFeed,
                        TCPosicionEnLista posicion, TCTimeStamp fechaNoticia);

                //recibe dos set de categorias, uno con las categorias a incluir
                //y otro con las categorias a excluir. Devuelve un set de elementos
                //TagItemConsulta que cumplen con el filtro.
                ConjuntoTagItemConsulta Consulta(set<int> feeds, ConjuntoIdCategoria categoriasAIncluir,
                        ConjuntoIdCategoria categoriasANoIncluir, TCTimeStamp since , TCTimeStamp until,
                                NewsManager* newsManager);
                //recibe el id de la categoria, el del feed y la posicion de la
                //noticia y lo borra del archivo de la categoria.
                bool SacarNoticia(TCId idCategoria, TCId idFeed,
                        TCPosicionEnLista posicion);

                //Recibe el cojunto de categorias a reorganizar (idealmente todas las categorias que queden
                //vivas en el mapa, y una referencia al manager de News.
                //Deja solo las categorizaciones que no esten dadas de baja de noticias que existan (que no tengan
                //baja logica).
                void ReorganizarArchivos(ConjuntoIdCategoria &categoriasALimpiar, NewsManager &newsManager);
};

//funcion global de comparacion necesaria para set_intersection
bool operator < (const TagItemConsulta & ltagitemconsulta, const TagItemConsulta & rtagitemconsulta);

#endif
